#pragma once 

#include <iostream>
#include <string>

std::string opers = "+-*/%";

enum
{
    div_zero = 1,
    mod_zero,
    UnKnown
};

class Task
{
public:
    Task(){}

    Task(int data1, int data2, char oper):_data1(data1), _data2(data2), _oper(oper), _result(0), _exitcode(0)
    {}

    void run()
    {  
        switch(_oper)
        {
            case '+':
                _result = _data1 + _data2;
                break;
            case '-':
                _result = _data1 - _data2;
                break;
            case '*':
                _result = _data1 * _data2;
                break;
            case '/':
                if(_data2 == 0)
                {
                    _exitcode = div_zero;
                }
                else{
                    _result = _data1 / _data2;
                }
                break;
            case '%':
                if(_data2 == 0)
                {
                    _exitcode = mod_zero;
                }
                else{
                    _result = _data1 % _data2;
                }
                break;
            default:
                _exitcode = UnKnown;
                break;
        }
    }

    std::string GetResult()
    {
        std::string ret = std::to_string(_data1);
        ret += _oper;
        ret += std::to_string(_data2);
        ret += "=";
        ret +=std::to_string(_result);
        ret += "[code: ";
        ret += std::to_string(_exitcode);
        ret += "]";
        return ret;
    }

    std::string GetTask()
    {
        std::string ret = std::to_string(_data1);
        ret += _oper;
        ret += std::to_string(_data2);
        ret += "=?";
        
        return ret;
    }

    void operator()()
    {
        run();
    }

    ~Task(){}
private:
    int _data1; 
    int _data2;
    char _oper;
    int _result;
    int _exitcode;
};